package com.jiang.jixiang;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.Application;
import android.content.Context;
import android.os.Handler;
import android.os.Looper;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatDelegate;

import com.jiang.jixiang.api.ApiUrl;
import com.jiang.jixiang.network.CommonalityModel;
import com.jiang.jixiang.network.NetWorkListener;
import com.jiang.jixiang.network.okHttpModel;
import com.jiang.jixiang.tools.ShareHelper;
import com.lzy.okgo.OkGo;
import com.lzy.okgo.interceptor.HttpLoggingInterceptor;
import com.scwang.smart.refresh.footer.ClassicsFooter;
import com.scwang.smart.refresh.header.ClassicsHeader;
import com.scwang.smart.refresh.layout.SmartRefreshLayout;
import com.scwang.smart.refresh.layout.api.RefreshFooter;
import com.scwang.smart.refresh.layout.api.RefreshHeader;
import com.scwang.smart.refresh.layout.api.RefreshLayout;
import com.scwang.smart.refresh.layout.listener.DefaultRefreshFooterCreator;
import com.scwang.smart.refresh.layout.listener.DefaultRefreshHeaderCreator;
import com.scwang.smart.refresh.layout.listener.DefaultRefreshInitializer;
import com.ws.universal.tools.ContextInit;
import com.ws.universal.tools.base.ManageActivity;
import com.ws.universal.tools.carsh.Cockroach;
import com.ws.universal.tools.carsh.CrashLogUtils;
import com.ws.universal.tools.carsh.DebugSafeModeUI;
import com.ws.universal.tools.carsh.ExceptionHandler;
import com.ws.universal.tools.network.HttpLogInterceptor;
import com.ws.universal.tools.utils.LogcatUtils;

import org.json.JSONObject;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;

import me.jessyan.autosize.AutoSize;
import me.jessyan.autosize.AutoSizeConfig;
import me.jessyan.autosize.onAdaptListener;
import okhttp3.OkHttpClient;

public class ClbAppLication extends Application {
    /**
     * 全局配置  SmartRefreshLayout
     */
    static {
        //启用矢量图兼容
        AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
        //设置全局默认配置（优先级最低，会被其他设置覆盖）
        SmartRefreshLayout.setDefaultRefreshInitializer(new DefaultRefreshInitializer() {
            @SuppressLint("RestrictedApi")
            @Override
            public void initialize(@NonNull Context context, @NonNull RefreshLayout layout) {
                //全局设置（优先级最低）
                //                layout.setEnableAutoLoadMore(true);
                //                layout.setEnableOverScrollDrag(false);
                //                layout.setEnableOverScrollBounce(true);
                //                layout.setEnableLoadMoreWhenContentNotFull(true);
                layout.setEnableScrollContentWhenRefreshed(true);
                layout.setEnableScrollContentWhenLoaded(true);

                //                layout.setFooterMaxDragRate(4.0F);
                //                layout.setFooterHeight(45);
            }
        });
        //设置全局的Header构建器
        SmartRefreshLayout.setDefaultRefreshHeaderCreator(new DefaultRefreshHeaderCreator() {
            @Override
            public RefreshHeader createRefreshHeader(Context context, RefreshLayout layout) {
                layout.setPrimaryColorsId(R.color.white, R.color.white);//全局设置主题颜色 头 尾

                return new ClassicsHeader(context).setAccentColor(context.getColor(R.color.ref_head_color));//.setTimeFormat(new DynamicTimeFormat("更新于 %s"));//指定为经典Header，默认是 贝塞尔雷达Header
            }
        });
        //设置全局的Footer构建器
        SmartRefreshLayout.setDefaultRefreshFooterCreator(new DefaultRefreshFooterCreator() {
            @Override
            public RefreshFooter createRefreshFooter(Context context, RefreshLayout layout) {
                //指定为经典Footer，默认是 BallPulseFooter

                return new ClassicsFooter(context);

                //.setFinishDuration(1000);
            }
        });
    }
    //private String publishableKey = "pk_test_51LKC1ZDliWA8dULWQauqf8feSB7w16B0KjcSuWzALRzFuhNF3b7UfWC9Vb2DpcWi6AuTQRnaoyTdZfIbRDMHfilQ00TKl0tDbq";
    //private String publishableKey="pk_live_51LKC1ZDliWA8dULWYRYerVgpos1o9mKqiuGdYreurW9XDpI041CGQbA99VPOWlXlSM8ECGPy3Oo7pBkFHzJJSxz800568QyTzk";

    private Context context;

    @Override
    public void onCreate() {
        super.onCreate();
        context = this;
        //各种初始化
        initializeManagers();

    }

    private void initializeManagers() {
        ContextInit.initial(context, context.getString(R.string.app_name));
        LogcatUtils.setGlobalTag(context.getString(R.string.app_name));
        LogcatUtils.setLogSwitch(BuildConfig.DEBUG);
        initAutoSize();
        ManageActivity.getInstance();
        initOkGo();
        ShareHelper.init(context);
        //initAppCarshListener();

    }

    /**
     * 初始化 okGo
     */
    private void initOkGo() {
        OkHttpClient.Builder builder = new OkHttpClient.Builder();
        HttpLogInterceptor loggingInterceptor = new HttpLogInterceptor(context.getString(R.string.app_name));
        //log打印级别，决定了log显示的详细程度
        loggingInterceptor.setPrintLevel(HttpLoggingInterceptor.Level.BODY);
        //log颜色级别，决定了log在控制台显示的颜色
        loggingInterceptor.setColorLevel(Level.INFO);
        builder.addInterceptor(loggingInterceptor);

        //全局的读取超时时间
        builder.readTimeout(60000, TimeUnit.MILLISECONDS);
        //全局的写入超时时间
        builder.writeTimeout(60000, TimeUnit.MILLISECONDS);
        //全局的连接超时时间
        builder.connectTimeout(60000, TimeUnit.MILLISECONDS);

        OkGo.getInstance().init(this)                       //必须调用初始化
                .setOkHttpClient(builder.build())               //建议设置OkHttpClient，不设置将使用默认的
                //.setCacheMode(CacheMode.NO_CACHE)               //全局统一缓存模式，默认不使用缓存，可以不传
                //.setCacheTime(CacheEntity.CACHE_NEVER_EXPIRE)   //全局统一缓存时间，默认永不过期，可以不传
                .setRetryCount(3);                               //全局统一超时重连次数，默认为三次，那么最差的情况会请求4次(一次原始请求，三次重连请求)，不需要可以设置为0

    }

    /**
     * App Carsh 监听
     */
    private void initAppCarshListener() {

        final Thread.UncaughtExceptionHandler sysExcepHandler = Thread.getDefaultUncaughtExceptionHandler();
        DebugSafeModeUI.init(this);
        Cockroach.install(this, new ExceptionHandler() {
            @Override
            protected void onUncaughtExceptionHappened(Thread thread, Throwable throwable) {
                LogcatUtils.e("AndroidRuntime", "--->onUncaughtExceptionHappened:" + thread + "<---", throwable, "--vvv");
                CrashLogUtils.saveCrashLog(getApplicationContext(), throwable);
                Map<String, String> params = new HashMap<>();
                params.put("type", "android");
                params.put("AppName", "ChargeEight");
                params.put("log", CrashLogUtils.upLoadCrashLog(getApplicationContext(), throwable));
                okHttpModel.post(ApiUrl.authLog_Api, params, ApiUrl.authLog_Api_ID, new NetWorkListener() {
                    @Override
                    public void onSucceed(JSONObject jsonData, int id, CommonalityModel commonality) {

                    }

                    @Override
                    public void onFail(JSONObject jsonData, int id, CommonalityModel commonality) {

                    }

                    @Override
                    public void onError(int id, Exception e) {

                    }
                });
                new Handler(Looper.getMainLooper()).post(new Runnable() {
                    @Override
                    public void run() {

                        LogcatUtils.e("AndroidRuntime crash 捕获到导致异常崩溃的异常 ");
                    }
                });
            }

            @Override
            protected void onBandageExceptionHappened(Throwable throwable) {
                throwable.printStackTrace();//打印警告级别log，该throwable可能是最开始的bug导致的，无需关心
                LogcatUtils.e("AndroidRuntime crash " + "Worked");
            }

            @Override
            protected void onEnterSafeMode() {
                LogcatUtils.e("AndroidRuntime crash 已经进入安全模式 ");
                //Toast.makeText(App.this, getResources().getString(tips), Toast.LENGTH_LONG).show();
                DebugSafeModeUI.showSafeModeUI();

                //                if (BuildConfig.DEBUG) {
                //                    Intent intent = new Intent(ReadApplication.this, DebugSafeModeTipActivity.class);
                //                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                //                    startActivity(intent);
                //                }
            }

            @Override
            protected void onMayBeBlackScreen(Throwable e) {
                Thread thread = Looper.getMainLooper().getThread();
                LogcatUtils.e("AndroidRuntime", "--->onUncaughtExceptionHappened:" + thread + "<---", e);
                //黑屏时建议直接杀死app
                sysExcepHandler.uncaughtException(thread, new RuntimeException("black screen"));
            }

        });


    }

    private void initAutoSize() {
        //当 App 中出现多进程, 并且您需要适配所有的进程, 就需要在 App 初始化时调用 initCompatMultiProcess()
        //在 Demo 中跳转的三方库中的 DefaultErrorActivity 就是在另外一个进程中, 所以要想适配这个 Activity 就需要调用 initCompatMultiProcess()
        AutoSize.initCompatMultiProcess(this);
        /**
         * 以下是 AndroidAutoSize 可以自定义的参数, {@link AutoSizeConfig} 的每个方法的注释都写的很详细
         * 使用前请一定记得跳进源码，查看方法的注释, 下面的注释只是简单描述!!!
         */
        AutoSizeConfig.getInstance()

                //是否让框架支持自定义 Fragment 的适配参数, 由于这个需求是比较少见的, 所以须要使用者手动开启
                //如果没有这个需求建议不开启
                .setCustomFragment(true)

                //是否屏蔽系统字体大小对 AndroidAutoSize 的影响, 如果为 true, App 内的字体的大小将不会跟随系统设置中字体大小的改变
                //如果为 false, 则会跟随系统设置中字体大小的改变, 默认为 false
                .setExcludeFontScale(true)

                //屏幕适配监听器
                .setOnAdaptListener(new onAdaptListener() {
                    @Override
                    public void onAdaptBefore(Object target, Activity activity) {
                        //使用以下代码, 可支持 Android 的分屏或缩放模式, 但前提是在分屏或缩放模式下当用户改变您 App 的窗口大小时
                        //系统会重绘当前的页面, 经测试在某些机型, 某些情况下系统不会重绘当前页面, ScreenUtils.getScreenSize(activity) 的参数一定要不要传 Application!!!
                        //AutoSizeConfig.getInstance().setScreenWidth(ScreenUtils.getScreenSize(activity)[0]);
                        //AutoSizeConfig.getInstance().setScreenHeight(ScreenUtils.getScreenSize(activity)[1]);
                        // LogcatUtils.d(String.format(Locale.ENGLISH, "%s onAdaptBefore!", target.getClass().getName()));
                    }

                    @Override
                    public void onAdaptAfter(Object target, Activity activity) {
                        //LogcatUtils.d(String.format(Locale.ENGLISH, "%s onAdaptAfter!", target.getClass().getName()));
                    }
                })
                //是否打印 AutoSize 的内部日志, 默认为 true, 如果您不想 AutoSize 打印日志, 则请设置为 false
                .setLog(false);
    }
}
